import axios, {
    AxiosError,
    type AxiosInstance,
    type AxiosRequestConfig,
    AxiosResponse,
    InternalAxiosRequestConfig
} from "axios";
import { UrlCheckUtils } from '../utils/index'

class AxiosInfra {
    public instance: AxiosInstance;

    public constructor() {
        this.instance = axios.create({
            baseURL: UrlCheckUtils.check(),
            timeout: Number(window.__APP_CONFIG__.VITE_HTTPTIMEOUT),
            headers: {
                "Content-Type": "application/json"
            }
        });
        this.ResponseInterceptor();
        this.RequestInterceptor();
    }

    public async get(params: AxiosRequestConfig): Promise<any> {
        return await this.instance.get(<string>params.url, {
            params: params.data,
            headers: Object.assign({ Authorization: localStorage.getItem("token") }, params.headers)
        });
    }

    public async post(params: AxiosRequestConfig): Promise<any> {
        return await this.instance.post(<string>params.url, params.data, {
            headers: Object.assign({ Authorization: localStorage.getItem("token") }, params.headers)
        })
    }

    /**
     * Put 请求
     * 请求参数请参考接口：RequestParams
     * @param params
     */
    public async put(params: AxiosRequestConfig): Promise<any> {
        return await this.instance.put(<string>params.url, params.data)
    }

    /**
     * delete 请求
     * 请求参数请参考接口：RequestParams
     * @param params
     */
    public async delete(params: AxiosRequestConfig): Promise<any> {
        return await this.instance.delete(<string>params.url, { params: params.data })
    }

    /**
     * 响应拦截器
     * @constructor
     */
    public async ResponseInterceptor(): Promise<void> {
        this.instance.interceptors.response.use(
            (response: AxiosResponse) => {
                return response.data.result;
            },
            (error: AxiosError) => {
                console.log(`
        ❌ 请求错误 ❌
        1、基地址: ${ error.config?.baseURL }
        2、短地址: ${ error.config?.url }
        3、请求 方式: ${ error.config?.method }
        4、请求 参数: ${ JSON.stringify(error.config?.params) }
        5、请求  头 :  ${ JSON.stringify(error.config?.headers) }
        
        ------------------------------------------------------------
        
        6、错误信息为: ${ error.message }
        7、错误代码为: ${ error.stack }
        `);
                return Promise.reject(error)
            })
    }

    /**
     * 添加请求拦截器
     * @constructor
     */
    public async RequestInterceptor(): Promise<void> {
        this.instance.interceptors.request.use((config: InternalAxiosRequestConfig) => {
            return config
        }, function (error: AxiosError) {
            return Promise.reject(error)
        })
    }

}


export default new AxiosInfra();